package avs.sistemaavs.controller;

import java.util.*;
import avs.sistemaavs.model.*;

public class ControladoraLocacao {

    Cliente c1 = null, c2 = null;
    ControladoraBusca b = new ControladoraBusca();
    //classe inchada
    //comentarios

    //comentarios
    //metodo longo
    //campo temporario
    public void realizarLocacao(Locadora locadora, ArrayList<Integer> numeroCatalogoFilmes, int numeroCartaoAVS) {
        ControladoraDevolucao controladoraDevolucao = new ControladoraDevolucao();
        if (verificarPendenciasCliente(locadora, numeroCartaoAVS, controladoraDevolucao)) {
            if (verificarVideos(locadora, numeroCatalogoFilmes)) {
                /*
                 * Campo temporário valorDevido substituido por query
                 */
                Aluguel aluguel = new Aluguel(calcularDataDevolucao(), numeroCatalogoFilmes, numeroCartaoAVS, calcularTaxaLocacao(numeroCatalogoFilmes));
                /*
                 * Metodo atualizarValorDevido extraido
                 */
                //
                atualizarValorDevido(locadora, numeroCatalogoFilmes, numeroCartaoAVS);
                /*
                 * Metodo adicionarAluguelEmLocadora extraído
                 */
                //adicionar aluguel a lista de Alugueis da Locadora
                adicionarAluguelEmLocadora(locadora, aluguel);
            }
        }
    }

    private void adicionarAluguelEmLocadora(Locadora locadora, Aluguel aluguel) {
        locadora.getAluguel().add(aluguel);
    }

    private void atualizarValorDevido(Locadora locadora, ArrayList<Integer> numeroCatalogoFilmes, int numeroCartaoAVS) {
        c1 = b.BuscaCliente(locadora, c2, numeroCartaoAVS);
        c1.setValorDevido(calcularTaxaLocacao(numeroCatalogoFilmes));
    }

    /*
     * Metodos clienteExiste e clienteSemPendencias extraídos
     * queries clienteExiste e clienteSemPendencias substituidas
     */
    //fazer dos metodos de condicionais privados
    private boolean verificarPendenciasCliente(Locadora locadora, int numeroCartaoAVS, ControladoraDevolucao controladoraDevolucao) {
        return clienteExiste(locadora, numeroCartaoAVS) && clienteSemPendencias(locadora, numeroCartaoAVS, controladoraDevolucao);
    }

    private boolean clienteSemPendencias(Locadora locadora, int numeroCartaoAVS, ControladoraDevolucao controladoraDevolucao) {
        return controladoraDevolucao.verificarPendenciaCliente(locadora, numeroCartaoAVS);
    }

    private boolean clienteExiste(Locadora locadora, int numeroCartaoAVS) {
        return verificarCliente(locadora, numeroCartaoAVS);
    }

    /*
     * Metodo contarVideos extraido, variavel temporaria numeroVideos substituida por query
     */
    public double calcularTaxaLocacao(ArrayList<Integer> numeroCatalogoFilmes) {
        return contarVideos(numeroCatalogoFilmes) * 2.0;
    }

    private int contarVideos(ArrayList<Integer> numeroCatalogoFilmes) {
        int numeroVideos = 0;
        Iterator<Integer> it = b.BuscaNumeroCatalogo(numeroCatalogoFilmes);
        while (it.hasNext()) {
            it.next();
            numeroVideos++;
        }
        return numeroVideos;
    }

    public Date calcularDataDevolucao() {
        Locale pt = new Locale("pt", "br");
        Calendar c = Calendar.getInstance(pt);
        c.add(Calendar.DATE, 3);
        Date dataDevolucao = c.getTime();
        return dataDevolucao;
    }

    /*
     * Metodo atualizarQuantidadeVideos extraido
     */
    public boolean verificarVideos(Locadora locadora, ArrayList<Integer> numeroCatalogoFilmes) {
        //codigo duplicado
        Iterator<Integer> it = b.BuscaNumeroCatalogo(numeroCatalogoFilmes);
        //verificar a disponibilidade de videos no estoque
        return atualizarQuantidadeVideos(locadora, it);

    }

    /*
     * Metodo setarQuantidadeVideos extraida
     */
    public boolean atualizarQuantidadeVideos(Locadora locadora, Iterator<Integer> it) {
        while (it.hasNext()) {
            Integer numeroCatalogo = it.next();
            Video v1 = null, v2 = b.BuscaVideo(locadora, v1, numeroCatalogo);
            if (v2 != null) {
                if (numeroCatalogo.equals(v2.getNumeroCatalogo())) {
                    if (v2.getQuantidade() > 0) {
                        setarQuantidadeVideos(locadora, v2);
                    } else {
                        return false;
                    }
                }
            }
        }
        return true;
    }

    private void setarQuantidadeVideos(Locadora locadora, Video v) {
        v.setQuantidade(v.getQuantidade() - 1);
    }

    public boolean verificarCliente(Locadora locadora, int numeroCartaoAVS) {
        c1 = b.BuscaCliente(locadora, c2, numeroCartaoAVS);
        if (c1 == null) {
            return false;
        } else {
            return true;
        }

    }
}
